package com.yonyou.pmclouds.outter.tenant;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.yonyou.iuap.tenant.entity.TenantInfo;
import com.yonyou.iuap.tenant.sdk.TenantCenter;
import com.yonyou.iuap.tenant.sdk.UserCenter;
import com.yonyou.pmclouds.ApplicationConsts;
import com.yonyou.pmclouds.basecom.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 *
 * <p>
 * <b>本类主要完成以下功能：与数据中心有关的操作方法</b>
 *
 * @version pm_cloud
 * @author zhangwce
 * @time 2018年1月25日 下午9:38:00
 */
@Slf4j
@Component
public class TenantOperator {

    private ObjectMapper objectMapper;

    public TenantOperator() {
        objectMapper = new ObjectMapper();
    }
    /**
     *
     * 方法功能描述：添加用户到数据中心下，并与应用关联。
     *
     * <b>参数说明</b>
     * @param tenantId
     * @param mobile
     * @param email
     * @throws BusinessException
     * @author zhangwce
     * @time 2018年1月25日 下午9:44:54
     */
    public void addUsersAndRelations(String tenantId,String mobile, String email) throws BusinessException {

        String jsonStr = buildAddInfo(mobile, email);

        Date beginDate = new Date();
        String addResult = UserCenter.addUsersAndRelations(tenantId, "pm_cloud", null, null,
                jsonStr);
        if(StringUtils.isEmpty(addResult)){
            log.error("用户加入体验数据中心发生异常：友户通服务异常");
            throw new BusinessException("用户加入体验数据中心发生异常：友户通服务异常");
        }
        log.error("访问接口，加入数据中心耗时："+ (new Date().getTime() - beginDate.getTime()));
        Map<String,Object> resultMap = null;
        try {
            resultMap = objectMapper.readValue(addResult, Map.class);
        } catch (Exception e) {
            log.error(e.getMessage());
        }

        String errorMsg = resultMap.get("errors") == null ? null : ((String)resultMap.get("errors"));
        if ("0".equals(resultMap.get("status")) || !StringUtils.isEmpty(errorMsg)) {

            log.error("用户加入体验数据中心发生异常，错误信息为：" + errorMsg);
            throw new BusinessException("用户加入体验数据中心发生异常，错误信息为："+resultMap.get("msg"));
        }
    }

    /**
     *
     * 方法功能描述：构造需要新增的信息，并转换成json。
     *
     * <b>参数说明</b>
     * @param mobile
     * @param email
     * @return
     * @author zhangwce
     * @time 2018年1月25日 下午9:46:34
     */
    private String buildAddInfo(String mobile, String email) {
        Map<String, Object> usersMap = new HashMap<String, Object>();
        Map<String, String> userMap = new HashMap<String, String>();
        List<Map> userList = new ArrayList<Map>();

        userMap.put("userMobile", mobile);
        userMap.put("userEmail", email);
        userList.add(userMap);
        usersMap.put("users", userList);

        String jsonStr = null;
        try {
            jsonStr = objectMapper.writeValueAsString(usersMap);
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return jsonStr;
    }

    /**
     * 为租户添加管理员
     *
     * 友户通接口中实际还可以传入userCode,
     * 由于userCode一般不会显示获取到，
     * 因此该方法目前只传用户名和联系方式
     * @param userName
     * @param userMobile
     * @param userEmail
     * @param tenantId
     * @throws BusinessException
     */
    public String addAdminToTenant(String userName,String userMobile,String userEmail, String tenantId) throws BusinessException {
        Map<String,String> param = new HashMap<String,String>();

        param.put("userName",userName);
        param.put("userMobile",userMobile);
        param.put("userEmail",userEmail);
        param.put("tenantId",tenantId);
        param.put("systemId", ApplicationConsts.APPLICATION_ID);
        param.put("para2","send");

        String addResult = TenantCenter.addAdminAndRelation(param);


        if(StringUtils.isEmpty(addResult)){
            log.error("企业账号添加管理员异常，具体信息为：友户通服务异常");
            throw new  BusinessException("企业账号添加管理员异常，具体信息为：友户通服务异常");
        }

        Map<String,Object> addResultMap = null;
        try {
            addResultMap = objectMapper.readValue(addResult,Map.class);
        } catch (IOException e) {
            log.error("租户添加管理员异常，具体信息为："+addResultMap.get("msg"));
        }

        if(Integer.valueOf(0).equals(addResultMap.get("status"))){
            log.error("租户添加管理员异常，具体信息为："+addResultMap.get("msg"));
            throw new BusinessException("租户添加管理员异常");
        }

        Map<String,Object> userMap = (Map<String,Object>)addResultMap.get("user");
        if(userMap == null)
            return null;
        return userMap.get("userId") == null?null:(String)userMap.get("userId");

    }

    /**
     *  新增租户信息
     *  addInfoParamMap中需要包含tenantName、linkman、mobilephone
     *  这三个key是与在网页新增时一致的，其余参数需要根据业务需求以及租户中心的API文档来确定
     *
     * @param tenantInfo
     * @return
     * @throws BusinessException
     * @author zhangwce
     */
    public Map addTenant(TenantInfo tenantInfo) throws BusinessException {

        String  addResult = TenantCenter.batchSaveTenantInfo(tenantInfo);

        if(StringUtils.isEmpty(addResult)){
            log.error("添加企业账号出现错误，具体信息为：友户通服务异常");
            throw new BusinessException("添加企业账号出现错误");
        }

        Map addResultMap = null;
        try {
            addResultMap = objectMapper.readValue(addResult, Map.class);
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        if(addResultMap == null)
            return null;
        if(Integer.valueOf(0).equals(addResultMap.get("status"))){
            log.error("添加企业账号出现错误，具体信息为：" + addResultMap.get("msg"));
            throw new BusinessException("添加企业账号出现错误");
        }
        return addResultMap;
    }

    /**
     * 开通工程云试用
     *
     * @param tenantId
     * @param endDate
     * @throws BusinessException
     */
    public void openPMCForTenant(String tenantId, Date endDate) throws BusinessException {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String end = sdf.format(endDate);
        String addAndActive = TenantCenter.addAndActive(tenantId, "pm_cloud","ontrail",end);
        if(StringUtils.isEmpty(addAndActive)){
            log.error("开通应用异常，具体信息为：友户通服务异常");
            throw new BusinessException("开通应用异常，具体信息为：友户通服务异常");
        }

        Map<String,Object> activeResultMap = new HashMap<String,Object>();
        try {
            activeResultMap = objectMapper.readValue(addAndActive,Map.class);
        } catch (IOException e) {
            log.error(e.getMessage());
        }

        if("0".equals(activeResultMap.get("status"))){
            log.error("试用数据中心开通应用异常，具体信息为："+activeResultMap.get("msg"));
            throw new BusinessException("开通应用异常，具体信息为："+activeResultMap.get("msg"));
        }

    }


}
